package com.handsome.单例模式;

/**
 * 懒汉式（双重判断）
 * 优点：两次判断可以保证线程安全，且效率较高
 * 结论：推荐使用
 * @author niechun
 * @date 2023/1/7 21:28
 */
public class SingletonLazy03 {
}
class SingletonLazyTest03 {
    //私有化构造方法
    private SingletonLazyTest03() {
    }

    //本类内部静态变量
    //添加volatile关键字，使得成员变量instance在线程之间可见，一旦变量有变化会被刷到主存中，对所有线程可见
    private static volatile SingletonLazyTest03 instance;


    //提供一个共有的静态方法返回对象实例
    //使用到该方法的时候才回去创建实例
    //加入synchronized同步代码块，在代码块中对变量instance再进行一次判断，由于一次只能有一个线程进入代码块中，所以只会创建一个实例
    public static SingletonLazyTest03 getInstance() {
        if (instance == null) {
            synchronized(SingletonLazyTest03.class){
                if (instance==null){
                    instance = new SingletonLazyTest03();
                }
            }
        }
        return instance;
    }

}